<?php
/**
 *    Copyright 2010 Show Framework(www.showframework.cn)
 *    Licensed under the Apache License, Version 2.0 (the "License");
 *    you may not use this file except in compliance with the License.
 *    You may obtain a copy of the License at
 * 
 *        http://www.apache.org/licenses/LICENSE-2.0
 * 
 *    Unless required by applicable law or agreed to in writing, software
 *    distributed under the License is distributed on an "AS IS" BASIS,
 *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *    See the License for the specific language governing permissions and
 *    limitations under the License.
 */

/**
 * 系统默认控制器
 * 用户自己写的控制器，最好直接继承这个类，以保证可用性
 * 也可以自己实现控制类接口
 *
 * @package Show
 * @name Show_Controller
 * @author show
 * @since v0.6
 */
class Show_Controller implements Show_Controller_Interface
{
    /**
     * 视图实例
     * 
     * @var Show_View_Interface
     * @since v0.6
     */
    protected $view;
    
    /**
     * 构造函数
     *
     * @return void
     * @since v0.6
     */
    public function __construct()
    {
    }
    
    /**
     * 初始化控制器
     * 用户自己写的控制器，可以重写此方法，以获得对控制器的初始化
     * 这个函数会在控制器类实例化后由框架最先调用
     * 这里给了一个空实现而不是抽象方法是为了继承的时候方便，可以不用写这个方法
     * 
     * @return void
     * @since v0.6
     */
    public function init()
    {
    }
    
    /**
     * 设置视图
     * 参数必须是 Show_View_Interface 类型，即必须继实现 Show_View_Interface 接口
     *
     * @param Show_View_Interface $view 视图实例
     * @return void
     * @since v0.6
     */
    public function setView(Show_View_Interface $view)
    {
        $this->view = $view;
    }
    
    /**
     * 设置视图的属性
     * $this->view->assign()的简化用法
     *
     * @param string $name 属性名称
     * @param mixed $value 属性值
     * @return void
     * @since v0.6
     */
    protected function assign($name, $value)
    {
        $this->view->assign($name, $value);
    }
    
    /**
     * 显示视图
     * $this->view->show()的简化用法
     * 
     * @return void
     * @since v0.6
     */
    protected function show()
    {
        $this->view->show();
    }
    
    /**
     * 获取url中携带的参数
     *
     * @param int $position 参数在命令中的位置，从0开始
     * @return string|null
     * @since v0.6
     */
    protected function getParam($position)
    {
        return isset($GLOBALS['show']['command_stack'][$position]) ? $GLOBALS['show']['command_stack'][$position] : null;
    }
    
    //////////////////////////////////////////////////
    //ajax 辅助函数
    //////////////////////////////////////////////////
    /**
     * 用Show_View_Json输出一个数组
     * 调用此方法前，最好先手动设置Show_View_Json
     *
     * @param array $data
     * @return void
     * @since v0.6
     */
    protected function ajaxShowJson(array $data)
    {
        if (!$this->view instanceof Show_View_Json) {
            $propertys = $this->view->getPropertys();
            $this->setView(new Show_View_Json());
            foreach ($propertys as $key => $value) {
                $this->view->assign($key, $value);
            }
        }
        foreach ($data as $key => $value) {
            $this->view->assign($key, $value);
        }
        $this->view->show();
    }
}
?>